package com.charging.business.media;

import com.alibaba.fastjson2.annotation.JSONField;
import com.charging.business.enums.PassStatus;
import com.charging.common.utils.DateUtils;

/**
 * 用户卡复合消费专用文件(DF01/0019)解码信息
 * 43bytes
 * @author lzj
 */
public class Card0019Model {
    /**
     * 复合消费应用标示(01-01,1,b)
     * 0xAA-ETC 正常插卡；
     * 0xBB-ETC 用户入口异常,入口信息写入OBU;
     * 0xCC-ETC用户入口异常，第一个读取到 OBU 的门架作为入口门架写入
     */
    @JSONField(ordinal = 1)
    public int applySign = 0xAA;

    /**
     * 记录长度(02-02,1,n)
     * 固定为0x29
     */
    @JSONField(ordinal = 2)
    public int recordLength = 0x29;

    /**
     * 应用锁定标示(03-03,1,n)
     * 0x00-未锁定；0x01-已锁定；其他值-保留
     */
    @JSONField(ordinal = 3)
    public int applyLockSign = 0x00;

    /**
     * 入/出口收费网络号(04-05,2,cn)
     * 样例:"4101"
     */
    @JSONField(ordinal = 4)
    public String netWork = "4101";

    /**
     * 入/出口收费站点(06-07,2,n)
     * 样例:"03F5" -> 01013 郑州南
     */
    @JSONField(ordinal = 5)
    public String enStationId = "0000";

    /**
     * 入/出口收费车道(08-08,1,n)
     * 样例:90-入口;190-出口
     */
    @JSONField(ordinal = 6)
    public int enLaneId = 0;

    /**
     * 入/出口时间(09-12,4,n)
     * UNIX时间
     */
    @JSONField(ordinal = 7)
    public long enTime = DateUtils.getNowDate().getTime() / 1000;

    /**
     * 车型(13-13,1,n)
     */
    @JSONField(ordinal = 8)
    public int vehicleType = 0;

    /**
     * 入/出口状态(14-14,1,n)
     * 0x00－保留， 0x 01－封闭 E/M混合入口， 0x02－封闭 E/M 混合出口， 0x03－封闭 ETC 入口，0x04－封闭 ETC 出口， 0x05－E/M 混合开放式， 0x06－ ETC 开放式， 0x07～ 0F 自定义， 0x10－自助
     */
    @JSONField(ordinal = 9)
    public int cardState = PassStatus.MIX_EX;

    /**
     * ETC门架编号(15-17,3,bn)
     * 样例:"000000"
     */
    @JSONField(ordinal = 10)
    public String preGantryNo = "000000";

    /**
     * 通行门架时间(18-21,4,n)
     * 北京时间 2015-4-2 15:36:20 UNIX 时间为 55 1C F1 74
     */
    @JSONField(ordinal = 11)
    public long preGantryTime = DateUtils.getNowDate().getTime() / 1000;

    /**
     * 车牌号码(22-33,12,an)
     * 不含颜色
     */
    @JSONField(ordinal = 12)
    public String plateNumber = "";

    /**
     * 车牌颜色(34-34,1,n)
     * 0x00 –蓝色； 0x01–黄色； 0x02 –黑色； 0x03 –白色； 0x04－渐变绿色； 0x05－黄绿双拼色； 0x06－蓝白渐变；0x07～ 0xFF 保留
     */
    @JSONField(ordinal = 13)
    public int plateColor = 0;

    /**
     * 车轴数-货车总轴数(35-35,1,n)
     */
    @JSONField(ordinal = 14)
    public int axleCount = 0;

    /**
     * 总重-货车总重(36-38,3,n)
     * 单位kg
     */
    @JSONField(ordinal = 15)
    public int totalWeight = 0;

    /**
     * 车辆状态标识(39-39,1,n)
     * 0x00－本次通行用于ETC大件运输
     * 0x01－非优惠车辆
     * 0x02－绿通
     * 0x03－联合收割机
     * 0x04－集装箱车辆
     * 0xFF－默认
     */
    @JSONField(ordinal = 16)
    public int vehicleSign = 0xFF;

    /**
     * 一类交易累计金额(40-43,4,n)
     * 单位：分
     */
    @JSONField(ordinal = 17)
    public long amounts = 0;

    /**
     * 获取全车牌号码
     * 可设置车牌颜色, 部分老卡颜色编码不对
     *
     * @param platClr - 车牌颜色
     * 0xff - 采用卡内颜色
     * 其他 - 需要设置的颜色
     * @return
     */
    public String getPlateNo(int platClr) {
        if (plateColor == 0xFF) {
            return String.format("%s_%d", plateNumber, platClr);
        }
        return String.format("%s_%d", plateNumber, plateColor);
    }

    /**
     * 检查是否正常上道
     */
    public String tstEnStatus() {
        if (applySign != 0xAA) {
            return "上道异常";
        } else if (applyLockSign != 0x00) {
            return "已锁定";
        } else if (cardState != PassStatus.ETC_EN && cardState != PassStatus.MIX_EN) {
            return "未上道";
        }
        return "";
    }

    /**
     * 比较ETC卡0019与OBU-DFEF04中的入口信息是否一致
     * 判断前39字节是否相同(到车辆状态标识)
     *
     * @param dd - OBU-DFEF04中的0019信息
     * @return - true:一致; false:不一致
     * @deprecated 不应该比较前序过门架信息, 仅应该比较入口信息(入口标签无卡不允许上道)
     * replaced by {@code tstEnWithEF04(UCARD0019DD dd)}.
     */
    @Deprecated
    @JSONField(serialize = false, deserialize = false)
    public boolean isSame(Card001939Model dd) {
        return applySign == dd.applySign && recordLength == dd.recordLength && applyLockSign == dd.applyLockSign && netWork.equals(dd.netWork) && enStationId.equals(dd.enStationId) && enLaneId == dd.enLaneId && enTime == dd.enTime && vehicleType == dd.vehicleType && cardState == dd.cardState && preGantryNo.equals(dd.preGantryNo) && preGantryTime == dd.preGantryTime && plateNumber.equals(dd.plateNumber) && plateColor == dd.plateColor && axleCount == dd.axleCount && totalWeight == dd.totalWeight && vehicleSign == dd.vehicleSign;
    }

    /**
     * 比较ETC卡0019与OBU-DFEF04中的入口信息是否一致
     * 排除如下信息
     * applySign - 应用标示
     * recordLength - 数据长度
     * applyLockSign - 应用锁定信息
     * preGantryNo - 前序门架HEX
     * preGantryTime - 过前序门架时间
     * amounts - 一类交易实收金额
     *
     * @param dd - OBU-DFEF04中的0019信息
     * @return
     */
    @JSONField(serialize = false, deserialize = false)
    public boolean tstEnWithEF04(Card001939Model dd) {
        //			applySign==dd.applySign &&
        //			recordLength==dd.recordLength &&
        //			applyLockSign==dd.applyLockSign &&
        //			preGantryNo.equals(dd.preGantryNo) &&
        //			preGantryTime==dd.preGantryTime &&
        return netWork.equals(dd.netWork) && enStationId.equals(dd.enStationId) && enLaneId == dd.enLaneId && enTime == dd.enTime && vehicleType == dd.vehicleType && cardState == dd.cardState && plateNumber.equals(dd.plateNumber) && plateColor == dd.plateColor && axleCount == dd.axleCount && totalWeight == dd.totalWeight && vehicleSign == dd.vehicleSign;
    }

    public String enStationHex() {
        return netWork + enStationId;
    }

    /**
     * 获取入口正常时的车辆状态
     *
     * @return
     */
    public int vehicleSign() {
        // 入口正常
        if (tstEnStatus().isEmpty()) {
            if ((vehicleType >= 11 && vehicleType <= 16) || (vehicleType >= 21 && vehicleType <= 26)) {
                // 为货车
                // 普通,大件,非优惠,绿通,联合收割机,集装箱
                if (vehicleSign == 0xFF || vehicleSign == 0x00 || vehicleSign == 0x01 || vehicleSign == 0x02 || vehicleSign == 0x03 || vehicleSign == 0x04) {
                    return vehicleSign;
                }
            }
        }

        return 0xFF;
    }
}
